 	package net.interneteidee.entity;

import java.util.List;

import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;
import javax.validation.constraints.Size;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;

@XmlRootElement
@Entity
public class Cliente implements Comparable<Cliente> {

	@Id
	@GeneratedValue
	private long idCliente;


    @Size(min=1, max=240 , message=" denominazione non deve essere nullo ")
	private String denominazione;

    @Size(min=1, max=16 , message=" codice fiscale non deve essere nullo ")
	private String codiceFiscale;

	@Embedded
	private Indirizzo indirizzo = new Indirizzo() ;

	@Size(min=1, max=16 , message=" telefono non deve essere nullo ")
	private String telefono;

	@Pattern (regexp=".+@.+\\.[a-z]+", message="mail non corretta")
	private String email;

	@Size(min=1, max=240 , message=" tipo pagamento non deve essere nullo ")
	private String tipoPagamento;
	
	
	private String principal;

	
	private int cap;
	
	
	private boolean abilitato;

	@OneToMany(mappedBy = "cliente")
	private List<Ordine> ordini;

	@OneToMany(mappedBy = "cliente")
	private List<Fattura> fatture;
	
	@ManyToOne
	@JoinColumn(name = "regione_fk" , nullable= true)
	// @NotNull(message = " devi selezionare una regione ") Dà fastidio al webServices
	private Regione regione;

	public Cliente() {
		// TODO Auto-generated constructor stub
	}

	public long getIdCliente() {
		return idCliente;
	}

	public void setIdCliente(long idCliente) {
		this.idCliente = idCliente;
	}


	public String getDenominazione() {
		return denominazione;
	}

	public void setDenominazione(String denominazione) {
		this.denominazione = denominazione;
	}

	public String getCodiceFiscale() {
		return codiceFiscale;
	}

	public void setCodiceFiscale(String codiceFiscale) {
		this.codiceFiscale = codiceFiscale;
	}

	public Indirizzo getIndirizzo() {
		return indirizzo;
	}

	public void setIndirizzo(Indirizzo indirizzo) {
		this.indirizzo = indirizzo;
	}

	public String getTelefono() {
		return telefono;
	}

	public void setTelefono(String telefono) {
		this.telefono = telefono;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}

	public String getTipoPagamento() {
		return tipoPagamento;
	}

	public void setTipoPagamento(String tipoPagamento) {
		this.tipoPagamento = tipoPagamento;
	}

	public int getCap() {
		return cap;
	}

	public void setCap(int cap) {
		this.cap = cap;
	}

	@XmlTransient
	public List<Ordine> getOrdini() {
		return ordini;
	}

	public void setOrdini(List<Ordine> ordini) {
		this.ordini = ordini;
	}

	@XmlTransient
	public List<Fattura> getFatture() {
		return fatture;
	}

	public void setFatture(List<Fattura> fatture) {
		this.fatture = fatture;
	}
	
	public boolean isAbilitato() {
		return abilitato;
	}

	public void setAbilitato(boolean abilitato) {
		this.abilitato = abilitato;
	}
	
	public String getPrincipal() {
		return principal;
	}

	public void setPrincipal(String principal) {
		this.principal = principal;
	}

	@XmlTransient
	public Regione getRegione() {
		return regione;
	}

	public void setRegione(Regione regione) {
		this.regione = regione;
	}

	/**
	 * Aggiunge un ordine al cliente
	 * 
	 * @param ordine
	 */
	public void addOrdine(Ordine ordine) {
		ordini.add(ordine);
	}

	/**
	 * Aggiunge una fattura al cliente
	 * 
	 * @param fattura
	 */
	public void addFattura(Fattura fattura) {
		fatture.add(fattura);
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + (abilitato ? 1231 : 1237);
		result = prime * result + cap;
		result = prime * result
				+ ((codiceFiscale == null) ? 0 : codiceFiscale.hashCode());
		result = prime * result
				+ ((denominazione == null) ? 0 : denominazione.hashCode());
		result = prime * result + ((email == null) ? 0 : email.hashCode());
		result = prime * result + (int) (idCliente ^ (idCliente >>> 32));
		result = prime * result
				+ ((indirizzo == null) ? 0 : indirizzo.hashCode());
		result = prime * result
				+ ((principal == null) ? 0 : principal.hashCode());
		result = prime * result + ((regione == null) ? 0 : regione.hashCode());
		result = prime * result
				+ ((telefono == null) ? 0 : telefono.hashCode());
		result = prime * result
				+ ((tipoPagamento == null) ? 0 : tipoPagamento.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Cliente other = (Cliente) obj;
		if (abilitato != other.abilitato)
			return false;
		if (cap != other.cap)
			return false;
		if (codiceFiscale == null) {
			if (other.codiceFiscale != null)
				return false;
		} else if (!codiceFiscale.equals(other.codiceFiscale))
			return false;
		if (denominazione == null) {
			if (other.denominazione != null)
				return false;
		} else if (!denominazione.equals(other.denominazione))
			return false;
		if (email == null) {
			if (other.email != null)
				return false;
		} else if (!email.equals(other.email))
			return false;
		if (idCliente != other.idCliente)
			return false;
		if (indirizzo == null) {
			if (other.indirizzo != null)
				return false;
		} else if (!indirizzo.equals(other.indirizzo))
			return false;
		if (principal == null) {
			if (other.principal != null)
				return false;
		} else if (!principal.equals(other.principal))
			return false;
		if (regione == null) {
			if (other.regione != null)
				return false;
		} else if (!regione.equals(other.regione))
			return false;
		if (telefono == null) {
			if (other.telefono != null)
				return false;
		} else if (!telefono.equals(other.telefono))
			return false;
		if (tipoPagamento == null) {
			if (other.tipoPagamento != null)
				return false;
		} else if (!tipoPagamento.equals(other.tipoPagamento))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return denominazione;
	}

	@Override
	public int compareTo(Cliente c2) {
		// TODO Auto-generated method stub
		if(this.idCliente<c2.idCliente)
			return -1;
		else if(this.idCliente==c2.idCliente)
			return 0;
		else
			return 1;
		
	}

	
	
	
}
